/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jogodecartas.controle;

import java.awt.HeadlessException;
import java.util.Scanner;
import javax.swing.JOptionPane;
import jogodecartas.core.Carta;
import jogodecartas.core.Descarte;
import jogodecartas.core.Estoque;
import jogodecartas.core.Fileiras;
import jogodecartas.core.Fundacoes;
import jogodecartas.core.PilhaDeCartas;

/**
 *
 * @author Diego
 */
public class JogoDePaciencia {

    public static PilhaDeCartas pilha;
    public static Fileiras fileiras;
    public static Estoque estoque;
    public static Descarte descarte;
    public static Fundacoes fundacoes;
    static String destinoDaCarta;
    static String origemDaCarta;
    protected static int viradasDoEstoque = 1;

    public JogoDePaciencia() {
        pilha = new PilhaDeCartas();
        pilha.startBaralho();
        fileiras = new Fileiras(pilha);
        fileiras.inicializarFileiras();
        fileiras.distribuirCartas();
        estoque = new Estoque(pilha);
        estoque.distribuirCartas();
        descarte = new Descarte();
        fundacoes = new Fundacoes();
        fundacoes.inicializarFundacoes();

    }

    public void iniciarJogo() {

        System.out.println("Jogo de Paciência");
        System.out.println("Divirta-se!");
        System.out.println("\nCartas do Jogo:");
        
        boolean flagExterno = true;
        while (flagExterno) {
            mostrarJogo();
            System.out.println("***********************MENU PACIÊNCIA***********************");
            System.out.println("1 - Mover Carta");
            System.out.println("2 - Mostrar Cartas do Jogo");
            System.out.println("3 - Virar Carta do Estoque");
            System.out.println("4 - Alterar Quantidade de Cartas a Virar do Estoque (Default - 1 carta por vez)");
            System.out.println("5 - Nova Partida");
            System.out.println("6 - Encerrar Partida");
            System.out.println("************************************************************");
            System.out.print("Escolha: ");
            String escolha1;
            Scanner input = new Scanner(System.in);
            escolha1 = input.next();
            System.out.println("Opção escolhida: " + escolha1);
            try {
                switch (Integer.parseInt(escolha1)) {
                    case 1:
                        System.out.println("Escolha o número do local onde a carta se encontra: ");
                        origemDaCarta = input.next();
                        System.out.println("Escolha o número do local para onde deseja mover a carta: ");
                        destinoDaCarta = input.next();
                        new Transicoes(origemDaCarta, destinoDaCarta);
                        if (fundacoes.getFundacao(0).size() == 13 && fundacoes.getFundacao(1).size() == 13 && fundacoes.getFundacao(2).size() == 13 && fundacoes.getFundacao(3).size() == 13) {
                            System.out.println("Parabéns! Você venceu!");
                            System.out.println("Obrigado pela paciência!");
                            flagExterno = false;
                        }
                        break;
                    case 2:
                        mostrarJogo();
                        break;
                    case 3:
                        if (estoque.getPilhaDeEstoque().isEmpty()) {
                            pilha.transferirPilha(descarte.getPilhaDeDescarte(), estoque.getPilhaDeEstoque());
                            break;
                        } else if (viradasDoEstoque == 1) {
                            descarte.getPilhaDeDescarte().push(estoque.pegarCarta(estoque.getPilhaDeEstoque()));
                        } else if (viradasDoEstoque == 2) {
                            descarte.getPilhaDeDescarte().push(estoque.pegarCarta(estoque.getPilhaDeEstoque()));
                            descarte.getPilhaDeDescarte().push(estoque.pegarCarta(estoque.getPilhaDeEstoque()));
                            descarte.getPilhaDeDescarte().push(estoque.pegarCarta(estoque.getPilhaDeEstoque()));
                        }
                        break;
                    case 4:
                        System.out.println("Opções:");
                        System.out.println("1 - Uma carta por vez");
                        System.out.println("2 - Três cartas por vez");
                        String escolha = input.next();
                        if (escolha.equals("1")) {
                            viradasDoEstoque = 1;
                            JOptionPane.showMessageDialog(null, "Opção 1 configurada!");
                            break;
                        }
                        if (escolha.equals("2")) {
                            viradasDoEstoque = 2;
                            JOptionPane.showMessageDialog(null, "Opção 2 configurada!");
                            break;
                        } else {
                            System.out.println("Opção Inválida");
                        }
                        break;
                    case 5:
                        System.out.println("Novo jogo!");
                        new JogoDePaciencia();
                        break;
                    case 6:
                        System.out.println("Obrigado pela paciência!");
                        flagExterno = false;
                        break;
                    default:
                        System.out.println("Opção Inválida");
                        break;
                }
            } catch (NumberFormatException numberFormatException) {
                System.out.println("Opção Inválida");
            } catch (HeadlessException headlessException) {
            }
        }
    }

    public void mostrarJogo() {
        String stringEstoque = "";
        String stringDescarte = "";
        for (int i = 0; i < 7; i++) {
            if (!fileiras.getFileira(i).isEmpty()) {
                fileiras.virarCarta((Carta) fileiras.getFileira(i).peek());
            }
        }

        for (int i = 0; i < estoque.getPilhaDeEstoque().size(); i++) {
            stringEstoque = stringEstoque + "[x], ";
        }
        for (int i = 0; i < descarte.getPilhaDeDescarte().size() - 1; i++) {
            stringDescarte = stringDescarte + "[x], ";
        }
        System.out.println("1 - Estoque: " + stringEstoque);
        if (descarte.primeiraCarta(descarte.getPilhaDeDescarte()) == null) {
            System.out.println("2 - Descarte: " + stringDescarte);
        } else {
            System.out.println("2 - Descarte: " + stringDescarte + descarte.primeiraCarta(descarte.getPilhaDeDescarte()));
        }
        System.out.println("");
        System.out.println("3 - Fundação 1: " + pilha.mostrarPilha(fundacoes.getFundacao(0)));
        System.out.println("4 - Fundação 2: " + pilha.mostrarPilha(fundacoes.getFundacao(1)));
        System.out.println("5 - Fundação 3: " + pilha.mostrarPilha(fundacoes.getFundacao(2)));
        System.out.println("6 - Fundação 4: " + pilha.mostrarPilha(fundacoes.getFundacao(3)));
        System.out.println("");
        System.out.println("7 - Fileira 1: " + pilha.mostrarPilha(fileiras.getFileira(0)));
        System.out.println("8 - Fileira 2: " + pilha.mostrarPilha(fileiras.getFileira(1)));
        System.out.println("9 - Fileira 3: " + pilha.mostrarPilha(fileiras.getFileira(2)));
        System.out.println("10 - Fileira 4: " + pilha.mostrarPilha(fileiras.getFileira(3)));
        System.out.println("11 - Fileira 5: " + pilha.mostrarPilha(fileiras.getFileira(4)));
        System.out.println("12 - Fileira 6: " + pilha.mostrarPilha(fileiras.getFileira(5)));
        System.out.println("13 - Fileira 7: " + pilha.mostrarPilha(fileiras.getFileira(6)));
        System.out.println("_________________________________________________________________________________");

    }
}
